/**
 * @author Q
 * @create 2025-06-16-15:13
 */

/**
 * 11.Spring AOP
 *      3.Spring AOP核心概念
 *      4.Spring AOP原理
 */
public class Test {
    public static void main(String[] args) {
        /**
         * 4.Spring AOP原理
         *      1.代理模式
         *          定义:为其它对象提供一种代理以对这个对象进行访问
         *          主要角色：
         *              Subject:业务接口（不一定有）
         *              RealSubject:业务实现类，具体代码实现，也就是被代理对象
         *              Proxy:RealSubject的代理
         *          根据创建时机，分为静态代理和动态代理
         *
         *          1.静态代理：程序运行前，代理类的.class文件已经产生
         *              1.创建接口
         *              2.创建业务实现类（实现接口）
         *              3.创建代理类（实现接口 + 创建业务实现类对象）
         *          2.动态代理：在程序运行时，运用反射机制动态创建生成
         *              1.JDK动态代理
         *                  1. 定义⼀个接⼝及其实现类(静态代理中的 HouseSubject 和 RealHouseSubject )
         *                  2. ⾃定义 InvocationHandler 并重写 invoke ⽅法，在 invoke ⽅法中我们会调⽤⽬标⽅法(被代理类的⽅法)并⾃定义⼀些处理逻辑
         *                  3. 通过 Proxy.newProxyInstance(ClassLoader loader,Class<?>[]interfaces,InvocationHandler h) ⽅法创建代理对象
         *              2.CGLIB动态代理
         *                  1. 定义⼀个类(被代理类)
         *                  2. ⾃定义 MethodInterceptor 并重写 intercept ⽅法， intercept ⽤于增强⽬标⽅法，和 JDK 动态代理中的 invoke ⽅法类似
         *                  3. 通过 Enhancer 类的 create()创建代理类
         *             3.区别
         *                  JDK只能代理接口，CGLIB既可以代理接口也可以代理类
         */
    }
    public static void main1(String[] args) {
        /**
         * 3.Spring AOP核心概念
         *      3.@PointCut:定义切点
         *          如果想要使用使用其它类想要使用该切点，则必须写出切点的完整路径
         *      4.@Order:切面优先级
         *          如果给数字，数字越大优先级越低，数字越小优先级越高
         *      5.切点表达式
         *          1.execution表达式
         *          (访问修饰符 返回类型 包名.类名.方法（方法参数） 异常)
         *          通配符表达式意思
         *              1.*，匹配任意字符，只匹配⼀个元素(返回类型, 包, 类名, ⽅法或者⽅法参数)
         *                  a. 包名使⽤ * 表⽰任意包(⼀层包使⽤⼀个*)
         *                  b. 类名使⽤ * 表⽰任意类
         *                  c. 返回值使⽤ * 表⽰任意返回值类型
         *                  d. ⽅法名使⽤ * 表⽰任意⽅法
         *                  e. 参数使⽤ * 表⽰⼀个任意类型的参数
         *              2... ：匹配多个连续的任意符号, 可以通配任意层级的包, 或任意类型, 任意个数的参数
         *                  a. 使⽤ .. 配置包名，标识此包以及此包下的所有⼦包
         *                  b. 可以使⽤ .. 配置参数，任意个任意类型的参数
         *          2.自定义注解，@annotation
         *              1.编写自定义注解类
         *              2.创建切面类
         *                  使⽤ @annotation切点表达式定义切点,只对自定义注解类⽣效
         *              3.给想要的位置添加自定义注解
         */
    }
}
